/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.om;

import java.util.EnumSet;

import org.apache.commons.lang.StringUtils;

/**
 * Enumération des nature personne
 * 
 * @author Guillaume Lancelin
 */
public enum NaturePersonne {

    /**
     * Particulier
     */
    PARTICULIER("PAR", "client.nature.particulier"),

    /**
     * Professionnel
     */
    PROFESSIONNEL("PRO", "client.nature.professionnel"),

    /**
     * Entreprise
     */
    ENTREPRISE("ENT", "client.nature.entreprise"),

    /**
     * Association
     */
    ASSOCIATION("ASS", "client.nature.association"),

    /**
     * Copropriété
     */
    COPROPRIETE("COP", "client.nature.copropriete"),

    /**
     * Collectivité
     */
    COLLECTIVITE("COL", "client.nature.collectivite"),

    /**
     * Autre
     */
    AUTRE("AUT", "client.nature.autre");

    /**
     * Valeur associée à l'énumération
     */
    private String value;

    /**
     * La clé utilisée pour afficher le libellé de la nature personne
     */
    private String cleLibelle;

    /**
     * Le constructeur
     * 
     * @param value la valeur
     * @param cleLibelle la clé du libellé
     */
    private NaturePersonne(String value, String cleLibelle) {
        this.value = value;
        this.cleLibelle = cleLibelle;
    }

    public String getValue() {
        return value;
    }

    public String getCleLibelle() {
        return cleLibelle;
    }

    /**
     * @param value la valeur
     * @return la nature personne à partir de sa valeur
     */
    public static NaturePersonne getNaturePersonneFromValue(String value) {
        NaturePersonne nature = null;

        for (NaturePersonne naturePersonne : EnumSet.allOf(NaturePersonne.class)) {
            if (naturePersonne.getValue().equals(value)) {
                nature = naturePersonne;
                break;
            }
        }

        return nature;
    }

    /**
     * @param <T> Nature Type
     * @param naturePersonne nature personne
     * @param nature nature
     * @return booleen sur la nature personne
     */
    private static <T> boolean isNaturePersonne(NaturePersonne naturePersonne, T nature) {

        boolean isNaturePersLocal = false;

        if (nature instanceof String) {

            isNaturePersLocal = StringUtils.equals(naturePersonne.value, String.class.cast(nature));

        } else if (nature instanceof NaturePersonne) {

            isNaturePersLocal = naturePersonne.equals(nature);
        }

        return isNaturePersLocal;

    }

    /**
     * @param <T> nature de la personne
     * @param nature nature de la personne
     * @return true si particulier
     */
    public static <T> boolean isNatureParticulier(T nature) {

        return isNaturePersonne(PARTICULIER, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si professionnelle
     */
    public static <T> boolean isNatureProfessionnelle(T nature) {

        return isNaturePersonne(PROFESSIONNEL, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si entreprise
     */
    public static <T> boolean isNatureEntreprise(T nature) {

        return isNaturePersonne(ENTREPRISE, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si association
     */
    public static <T> boolean isNatureAssociation(T nature) {

        return isNaturePersonne(ASSOCIATION, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si copropriete
     */
    public static <T> boolean isNatureCopropriete(T nature) {

        return isNaturePersonne(COPROPRIETE, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si collectivite
     */
    public static <T> boolean isNatureCollectivite(T nature) {

        return isNaturePersonne(COLLECTIVITE, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si autre
     */
    public static <T> boolean isNatureAutre(T nature) {

        return isNaturePersonne(AUTRE, nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si nature physique
     */
    public static <T> boolean isNaturePhysique(T nature) {

        return isNatureParticulier(nature) || isNatureProfessionnelle(nature);
    }

    /**
     * @param <T> nature de la personne
     * @param nature de la personne
     * @return true si nature morale
     */
    public static <T> boolean isNatureMorale(T nature) {

        boolean isNatureMoraleLoc = isNatureEntreprise(nature) || isNatureCopropriete(nature);

        isNatureMoraleLoc = isNatureMoraleLoc || isNatureCollectivite(nature);
        isNatureMoraleLoc = isNatureMoraleLoc || isNatureAssociation(nature);
        isNatureMoraleLoc = isNatureMoraleLoc || isNatureAutre(nature);

        return isNatureMoraleLoc;

    }
}
